package sessionManager;

import java.util.List;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;

import Partido.PartidoSimple;
import consultas.HistorialPCopas;
import consultas.HistorialPSimples;
import consultas.HistorialVictorias;
import daos.DAO;
import equipos.Equipo;

/**
 * TODO: description
 */
public class SessionManager {

    // Singleton
    private static SessionManager INSTANCE = new SessionManager();

    private SessionFactory sessionFactory;

    // Singleton
    private SessionManager() {
        Configuration cfg = new Configuration();
        cfg.configure();

        this.sessionFactory = cfg.buildSessionFactory();
    }

    public static SessionManager getInstance() {
        return INSTANCE;
    }

    public Session getSession() {
        return this.sessionFactory.openSession();
    }

    public void commit(final Session session, final Object object) {
        session.saveOrUpdate(object);
    }

    public void closeSession(final Session session) {
        session.flush();
        session.close();
    }

    public List<Equipo> equipos() {
        Session session = this.getSession();

        DAO dao = new DAO();
        List<Equipo> equipos = dao.obtenerEquipos(session);

        return equipos;
    }

    public List<Equipo> victoriasEnTotal() {
        Session session = this.getSession();

        List<Equipo> equipos = this.equipos();

        HistorialPSimples historial = new HistorialPSimples();
        List<Equipo> victoriasEnTotal = historial.obtenerLista(session, equipos);

        return victoriasEnTotal;
    }

    public List<Equipo> equiposOrdenadosPorMenorCantVictorias() {
        Session session = this.getSession();

        List<Equipo> equipos = this.equipos();

        HistorialPSimples historial = new HistorialPSimples();
        List<Equipo> victoriasEnTotal = historial.obtenerLista2(session, equipos);

        return victoriasEnTotal;
    }

    public List<Equipo> victoriasEnPartidosDeCopa() {
        Session session = this.getSession();

        List<Equipo> equipos = this.equipos();

        HistorialPCopas historial = new HistorialPCopas();
        List<Equipo> victoriasEnTotal = historial.obtenerLista(session, equipos);

        return victoriasEnTotal;
    }

    public HistorialVictorias historialVictorias(final int id1, final int id2) {
        Session session = this.getSession();
        Equipo equipo1 = (Equipo) session.load(Equipo.class, id1);
        Equipo equipo2 = (Equipo) session.load(Equipo.class, id2);

        HistorialVictorias victoriasLocal = new HistorialVictorias();
        victoriasLocal.victoriasEntreEquipos(session, equipo1, equipo2);

        return victoriasLocal;
    }

    public List<PartidoSimple> partidosGanadosPorEquipo1(final int id1, final int id2) {
        Session session = this.getSession();
        Equipo equipo1 = (Equipo) session.load(Equipo.class, id1);
        Equipo equipo2 = (Equipo) session.load(Equipo.class, id2);

        DAO dao = new DAO();

        List<PartidoSimple> partidosGanadosPorEquipo1 = dao.partidosGanadosEquipo1(session, equipo1, equipo2);

        return partidosGanadosPorEquipo1;
    }

    public List<PartidoSimple> partidosGanadosPorEquipo2(final int id1, final int id2) {
        Session session = this.getSession();
        Equipo equipo1 = (Equipo) session.load(Equipo.class, id1);
        Equipo equipo2 = (Equipo) session.load(Equipo.class, id2);

        DAO dao = new DAO();

        List<PartidoSimple> partidosGanadosPorEquipo2 = dao.partidosGanadosEquipo2(session, equipo1, equipo2);

        return partidosGanadosPorEquipo2;
    }

    public List<PartidoSimple> empatesEntreDosEquipos(final int id1, final int id2) {
        Session session = this.getSession();
        Equipo equipo1 = (Equipo) session.load(Equipo.class, id1);
        Equipo equipo2 = (Equipo) session.load(Equipo.class, id2);

        DAO dao = new DAO();

        return dao.empatesEquipos(session, equipo1, equipo2);
    }

    // ALTERNATIVA VICTORIAS EN TOTAL PARTIDOS SIMPLES CON 2 CONSULTAS
    public List<Equipo> victoriasEnTotalOptimizado() {
        Session session = this.getSession();

        List<Equipo> equipos = this.equipos();

        HistorialPSimples historial = new HistorialPSimples();
        List<Equipo> victoriasEnTotal = historial.obtenerLista3(session, equipos);

        return victoriasEnTotal;
    }

    public List<Equipo> victoriasEnTotalOptimizadoReverse() {
        Session session = this.getSession();

        List<Equipo> equipos = this.equipos();

        HistorialPSimples historial = new HistorialPSimples();
        List<Equipo> victoriasEnTotal = historial.obtenerLista4(session, equipos);

        return victoriasEnTotal;
    }

    // ALTERNATIVA VICTORIAS EN TOTAL PARTIDOS DE COPA CON 2 CONSULTAS
    public List<Equipo> victoriasEnPartidosDeCopaOptimizado() {
        Session session = this.getSession();

        List<Equipo> equipos = this.equipos();

        HistorialPCopas historial = new HistorialPCopas();
        List<Equipo> victoriasEnTotal = historial.obtenerLista3(session, equipos);

        return victoriasEnTotal;
    }
}
